package servicios;

import com.google.gson.Gson;

import utils.Constantes;
import utils.HttpHelper;
import utils.PreferencesHelper;
import entidades.PuntoGeografico;
import android.app.IntentService;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;

public class ActualizacionPuntoService extends IntentService
{
	private LocationManager locManager;
	private LocationListener locListener;
	
	private Location loc;
	
	private boolean seguir;
	
	public ActualizacionPuntoService ()
	{
		super ("actualizacionPunto");
		seguir = true;
	}

	@Override
	protected void onHandleIntent(Intent intent)
	{
		Log.i("LOG", "Inicia servicio.");
		
		while (seguir)
		{
			comenzarLocalizacion();
			
			synchronized (this)
			{
				try
				{
					wait(10000);
				}
				catch (Exception e)
				{
					
				}
			}
		}
		
		Log.i("LOG", "Termina servicio.");
		
	}
	
	@Override
	public void onDestroy()
	{
		seguir = false;
		super.onDestroy();
	}
	
	private void comenzarLocalizacion()
	{
		// Obtenemos una referencia al LocationManager
		locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

		// Obtenemos la última posición conocida
		loc = locManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
		
		mandar();

		// Nos registramos para recibir actualizaciones de la posición
		locListener = new LocationListener()
		{
			public void onLocationChanged(Location location)
			{
				loc = location;
				mandar ();
			}

			public void onProviderDisabled(String provider)
			{

			}

			public void onProviderEnabled(String provider)
			{

			}

			public void onStatusChanged(String provider, int status,
					Bundle extras)
			{
				Log.i("LOG", "Provider Status: " + status);
			}
		};

		locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 30000,
				0, locListener);
	}
	
	private void mandar ()
	{
		PuntoGeografico punto = construirPunto();
		new ActualizarPunto().execute(punto);
	}
	
	private PuntoGeografico construirPunto ()
	{
		double latitud = 0, longitud = 0;
		
		if (loc != null)
		{
			latitud = loc.getLatitude();
			longitud = loc.getLongitude();
		}
		
		return new PuntoGeografico(latitud, longitud);
	}
	
	private class ActualizarPunto extends AsyncTask<PuntoGeografico, String, String>
	{
		@Override
		protected String doInBackground(PuntoGeografico... params)
		{
			long id = new PreferencesHelper(getApplicationContext()).leerID();
			
			if (id < 1)
			{
				seguir = false;
				return null;
			}
			
			HttpHelper helper = new HttpHelper(Constantes.URL_COMPLETA + Constantes.CHOFERES);
			
			String res = helper.doPost(Constantes.ACTUALIZAR_PUNTO + "?id=" + id, null, new Gson().toJson(params[0]));
			
			Log.i("LOG", "Actualizacion punto: " + res);
			
			return null;
		}
	}
}
